Às vezes (na verdade, com muita frequência) é fácil ficar preso em um enigma de programação durante a codificação, depuração ou solução mental de um problema. Especialmente nos estágios iniciais de senioridade, as pessoas tendem a encarar um problema de programação (como corrigir bugs ou executar testes…) de frente, pensando uma solução provável, experimentando-a e verificando se o problema foi resolvido ou não repetidamente. Nesse sentido, a aplicação de métodos científicos a esse processo de solução de problemas pode ser benéfica na engenharia de software.

O que é método científico?

O Método Científico é uma técnica empírica usada para construir uma hipótese científica. Essas palavras bonitas significam simplesmente: usando a lógica, construímos uma hipótese para explicar um ocorrido. Este método envolve observação baseada no ceticismo (uma vez que suposições cognitivas podem distorcer a interpretação das observações). Após a observação, questões são levantadas e as respostas são coletadas por meio de testes e experimentos. Esta metodologia é útil em vários campos, incluindo investigação científica, ciências naturais e, como veremos a seguir, até engenharia!

Esta técnica consiste nas seguintes etapas:

  1. Observação/Pergunta: O método científico começa com uma pergunta ou questionamento sobre algo.
  2. Pesquisa sobre o tópico: Antes de começar e buscar uma solução em potencial, são realizadas pesquisas para aprender mais sobre o assunto e coletar referências.
  3. Hipótese: Crie um palpite fundamentado sobre a resposta esperada da sua observação/questionamento proposto.
  4. Testar a hipótese com um experimento: Verifique se sua hipótese é válida realizando um teste justo, alterando um fator de cada vez e mantendo as mesmas condições de teste para verificar o resultado final.
  5. Analisar dados: Analise os dados coletados para determinar se eles apoiam ou refutam a hipótese.
  6. Tirar uma conclusão: Determine se a hipótese é aceitável com base na análise dos dados.

Essas etapas são realizadas em ambiente controlado e monitorado, o que significa que somos capazes de observar possíveis variáveis que podem interferir no resultado. Essas variáveis podem ser:

  • Variáveis de controle: Também conhecidas como “variáveis constantes”, são variáveis que são mantidas iguais durante o experimento.
  • Variáveis independentes: Variáveis ou condições que podem ser ajustadas para afetar o resultado do experimento.
  • Variáveis dependentes: Essas variáveis são medidas ou observadas em como respondem com base nas alterações feitas nas variáveis independentes.

OK, mas o que isso tem a ver com desenvolvimento de software?

Você deve estar se perguntando o que o método científico tem a ver com o desenvolvimento de software. À primeira vista, pode parecer uma incompatibilidade - afinal, pode-se argumentar que a ciência trata do estudo do mundo natural, enquanto a codificação trata de ficar encurvado na frente de um computador escrevendo… código. Mas pensa bem! Os princípios do método científico são surpreendentemente relevantes para o trabalho diário dos desenvolvedores de software. Vamos ver como.

Análise de erros

Usar técnicas do método científico para identificar e resolver bugs em um código é bastante útil. Aplicando as etapas acima:

  1. Identifique um problema ou bug a ser investigado. Isso representa a hipótese. Por exemplo, “O programa trava e fecha inesperadamente”.
  2. Se necessário, faça pesquisas adicionais sobre as ferramentas, linguagens, configurações e/ou estruturas utilizadas no programa em questão. Isso lhe dará mais experiências e conhecimento para o próximo passo.
  3. Projete um experimento controlado para testar sua hipótese. Pensando na hipótese acima, você pode escrever testes unitários ou criar um reprodutor para o bug. O objetivo é coletar mais informações sobre o assunto e descartar possíveis variáveis que possam interferir no resultado.
  4. Execute o experimento (por exemplo, execute o programa para observar a falha). Colete os resultados, possíveis comportamentos inesperados, variáveis…
  5. Analise os dados, tentando correlacionar o resultado com as variáveis.
  6. Se necessário, repita o experimento, alterando variáveis e/ou ambiente. Quando o potencial culpado for encontrado, a hipótese pode ser considerada resolvida.

As vezes, realizamos algo semelhante ao processo acima intuitivamente ao resolver um problema e isso é ótimo! A aplicação explícita (e consciente) dessas etapas pode melhorar a precisão da resolução do problema.

Desenvolvimento baseado em hipóteses

E se tratássemos cada recurso ou correção de bug como uma hipótese e, em seguida, projetássemos nosso processo de desenvolvimento em torno de testes e verificação dessa hipótese?

Este é o conceito conhecido como Desenvolvimento Orientado a Hipóteses (Hypothesis-Driven Development - HDD).

Semelhante às etapas do método científico apontadas acima, começamos definindo uma hipótese clara, como “A implementação deste recurso aumentará o uso do programa pelos dos usuários em 30%”. Depois disso, é criado um plano para testar a hipótese, como:

  • Implementar e implantar x, y e z como pontos-chave do recurso;
  • Realizar testes A/B para comparar a nova funcionalidade com o comportamento anterior;
  • Coletar dados sobre interação do usuário, métricas de desempenho, métricas de negócios… Com o plano criado, as mudanças são implementadas e o experimento é executado. Em alguns casos, uma simulação pode ser executada para conduzir o experimento, ou o novo recurso pode ser usado por uma pequena parcela de usuários por um período específico de tempo. Depois disso, os resultados são analisados e a hipótese é validada: se os resultados foram alcançados a hipótese foi confirmada e pode ser adotada, caso contrário, novas rodadas de experimento podem ser conduzidas com novas hipóteses.

Esta jeito de desenvolver pode parecer bem semelhante ao Test Driven Development (TDD). No entanto, tenha em mente que o HDD se concentra no desenvolvimento de recursos ou correções de bugs com base em hipóteses específicas e em como eles irão melhorar o sistema ou a experiência do usuário, enquanto o TDD enfatiza a escrita de testes unitários para alterações de código individuais para garantir correção e confiabilidade em menor escala.

Experimentação com diferentes algoritmos

Também podemos usar o método científico para comparar diferentes algoritmos para resolver um problema específico – e também determinar qual deles é o mais eficaz. Com uma hipótese como “O algoritmo A superará o algoritmo B em termos de precisão quando usado para prever o risco de crédito”, podemos projetar um experimento comparando ambas as opções de algoritmo usando dados de entrada, métricas de avaliação e usuários como dados de controle. Também é importante utilizar um ambiente controlado, para evitar que fatores externos influenciem os resultados.

Após a execução do experimento, o desempenho de cada algoritmo é coletado e analisado para determinar qual algoritmo é o melhor conforme sugerido pela hipótese. Também podemos expandir e refinar a hipótese, identificando limitações ou vieses no experimento e propondo explicações alternativas para os resultados (por exemplo, “O algoritmo A pode ter um desempenho melhor devido à sua capacidade avançada de lidar com dados não agrupados”).

…e muitos mais!

Existem muitos outras propostas interessantes que podem se beneficiar do uso do método científico, como:

  • Revisão de código, ao avaliar a eficácia de diferentes soluções para resolver um problema específico
  • Priorização de recursos, ao determinar qual recurso tem maior importância e impacto dadas certas restrições
  • Análise de débito técnico, utilizando métricas para determinar qual débito técnico terá maior impacto positivo no projeto quando resolvido

Os benefícios de usar essas técnicas para resolver problemas é poder abordar problemas - e, como mostrado, não apenas preposições científicas! - com uma abordagem sistemática baseada em dados, isolando questões subjacentes e tendo um conhecimento mais completo do problema em questão. Experimente!

Leitura Adicional

Scientific Method - Wikipedia

Steps of the Scientific Method - Science Buddies

The scientific method and programming - Josh Peterson